package com.uam.core.lk.utils;

import java.io.Serializable;
import java.text.MessageFormat;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.helpers.MessageFormatter;

/**
 * @Description   封装日志工具,解决日志打印异常影响业务问题，并进行了日志级别优化
 *  *  先判定日志级别，然后进行日志的拼装。减少不必要的拼装
 * @Version 1.0
 * @Author 祝展
 * @Date 2019/10/23 15:17
 **/
public class LogUtils implements Serializable {

    private static final long serialVersionUID = 3993187523235317784L;
    private static final Logger LOGGER = LoggerFactory.getLogger(LogUtils.class);
    private static final String DELIM_STR = "{}";
    /**
     *
     * Description: info 日志消息记录
     *
     * @Version1.0 2017- 6-4 下午11:32:06 by 祝展展 创建
     * @param logger
     *            日志对象
     * @param message
     *            记录日志的消息 例如:<code>xxxxxx{0}xxxxx{1} </code>
     * @param args
     *            具体消息参数 用于替代{0}{1}
     */
    public static void info(Logger logger, String message, Object... args) {
        try {
            if (logger.isInfoEnabled()) {
                logger.info(LogUtils.messageFormat(message, args));
            }
        } catch (Exception e) {
        }
    }

    /**
     *
     * Description: warn 日志消息记录
     *
     * @Version1.0 2017- 6-4 下午11:32:06 by 祝展展 创建
     * @param logger
     *            日志对象
     * @param message
     *            记录日志的消息 例如:<code>xxxxxx{0}xxxxx{1} </code>
     * @param args
     *            具体消息参数 用于替代{0}{1}
     */
    public static void warn(Logger logger, String message, Object... args) {
        try {
            if (logger.isWarnEnabled()) {
                logger.warn(LogUtils.messageFormat(message, args));
            }
        } catch (Exception e) {
        }
    }

    /**
     *
     * Description: warn 日志消息记录
     *
     * @Version1.0 2017- 6-4 下午11:32:06 by 祝展展 创建
     * @param logger
     *            日志对象
     * @param exception
     *            具体的异常信息
     * @param message
     *            记录日志的消息 例如:<code>xxxxxx{0}xxxxx{1} </code>
     * @param args
     *            具体消息参数 用于替代{0}{1}
     */
    public static void warn(Logger logger, Throwable exception, String message,
                            Object... args) {
        try {
            if (logger.isWarnEnabled()) {
                logger.warn(LogUtils.messageFormat(message, args), exception);
            }
        } catch (Exception e) {
        }
    }

    /**
     *
     * Description: debug 日志消息记录
     *
     * @Version1.0 2017- 6-4 下午11:32:06 by 祝展展 创建
     * @param logger
     *            日志对象
     * @param message
     *            记录日志的消息 例如:<code>xxxxxx{0}xxxxx{1} </code>
     * @param args
     *            具体消息参数 用于替代{0}{1}
     */
    public static void debug(Logger logger, String message, Object... args) {
        try {
            if (logger.isDebugEnabled()) {
                logger.debug(LogUtils.messageFormat(message, args));
            }
        } catch (Exception e) {
        }
    }

    /**
     *
     * Description: error 日志消息记录
     *
     * @Version1.0   2017- 6-4 下午11:32:06 by 祝展展 创建
     * @param logger
     *            日志对象
     * @param exception
     *            具体的异常信息
     * @param message
     *            记录日志的消息 例如:<code>xxxxxx{0}xxxxx{1} </code>
     * @param args
     *            具体消息参数 用于替代{0}{1}
     */
    public static void error(Logger logger, Throwable exception,
                             String message, Object... args) {
        try {
            if (logger.isErrorEnabled()) {
                logger.error(LogUtils.messageFormat(message, args), exception);
            }
        } catch (Exception e) {
        }
    }

    /**
     *
     * Description: error 日志消息记录
     *
     * @Version1.0  2017- 6-4 下午11:32:06 by 祝展展 创建
     * @param logger
     *            日志对象
     * @param message
     *            记录日志的消息 例如:<code>xxxxxx{0}xxxxx{1} </code>
     * @param args
     *            具体消息参数 用于替代{0}{1}
     */
    public static void error(Logger logger, String message, Object... args) {
        try {
            if (logger.isErrorEnabled()) {
                logger.error(LogUtils.messageFormat(message, args));
            }
        } catch (Exception e) {
        }
    }

    /**
     * 格式化消息信息
     *
     * @param message
     * @param args
     * @return消息信息 x
     */
    public static String messageFormat(String message, Object... args) {
        try {
            String str = "";
            if (StringUtils.isEmpty(message)) {
                return str;
            }
            if (message.contains(DELIM_STR) ){
                if (message.contains("{0}") || message.contains("{1}") || message.contains("{2}")){
                    throw new RuntimeException("日志格式不对,既包含{}占位符，又包含{0}{1}{2}占位符 ，请检查");
                }else{
                   str = MessageFormatter.arrayFormat(message, args).getMessage();
                }
            }else{
                 str = MessageFormat.format(message, args);
            }
            return str;
        } catch (Exception e) {
            LOGGER.error("Log日志工具类messageFormat(String message,Object... args)发生异常:", e);
        }
        return "";
    }

    private LogUtils() {

    }

//    public static void main(String[] args) {
//        String str = LogUtils.messageFormat("Token检查未通过, accessToken={},uri={},res ={}", "token", "requestURI", "object2Json");
//        System.out.println(str);
//        str = LogUtils.messageFormat("Token检查未通过, accessToken={0},uri={1},res ={2}", "token", "requestURI", "object2Json");
//        System.out.println(str);
//        System.out.println();
//    }
}
